package examples;

import examples.newEntityCreation.ExampleTheadBased2DEntity;
import examples.spawners.SimpleSpawnerExample;
import games.Game;
import games.singleplayer.SinglePlayer;
import graphic.GameView;
import graphic.render.Render2D;

import java.awt.event.KeyListener;
import java.awt.event.MouseListener;

import model.Coordinate;
import model.collision.CollisionEngine;
import model.collision.Round2DCollisionEngine;
import model.entity.Entity2D;
import model.spawner.Spawner2D;
import param.GraphicsParam;
import utils.TestMouseListener;

/**
 * Classe di esempio per la creazione di una nuova modalita'.
 * Nota: avviare con {@link GameLauncherExample}
 * @author Jan
 *
 */
public class GameModeExample extends GameView {
	
	
	private static final long serialVersionUID = 1462165010746973723L;
	
	//Di supporto, per non creare continuamente nuove variabili in memoria.
	private Spawner2D spawner;
	private CollisionEngine collisionEngine;
	private Entity2D testEntity;
	
	private Game game;
	
	//Contenitore per le entita' temporanee.
	private Entity2D[] entities;
	
	
	/**
	 * Costruttore modalita'
	 */
	public GameModeExample(Render2D render) {
		super(render);
		
		//Definizione di quali entita' sono richieste per madalita'
		//Entita' interattiva.
		testEntity = new ExampleTheadBased2DEntity(0, Coordinate.INITIAL_SHIP_2D_COORDINATE, 0);
		TestMouseListener mouse = new TestMouseListener(testEntity);
		addMouseMotionListener(mouse);
		//Serve dargli lo start?
		
		
		//Specificare qual'e' lo spawner da utilizzare!!!
		spawner = new SimpleSpawnerExample(200, GraphicsParam.GAME_WIDTH-200, -300);
		addKeyListener((KeyListener) spawner);
		addMouseListener((MouseListener) spawner);
		//lo start lo da Game.
		
		
		//Specifica di quale engine usare per le collisioni, se ci sono.
		collisionEngine = new Round2DCollisionEngine(testEntity, spawner);
		//lo start lo da Game.
		
		game = new SinglePlayer(spawner, collisionEngine);
		game.start();
	}
	
	
	
	
	
	//Definizione di quali entita' devono essere renderizzare.
	@Override
	public void tick(Render2D renderScreen) {
		renderScreen.cleanRenderArea();
		entities = spawner.cloneActalEntityBuffer();
		renderScreen.centredRender( entities );
		renderScreen.centredRender( testEntity );
	}
}
